/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef DOMPARSER_H
#define DOMPARSER_H


#include <QDomNamedNodeMap>
#include <QDomDocument>
#include <QStringList>
#include <QFile>
#include <QMutex>
//#include "GeneralDefine.h"
//#include "md5check.h"


/**
 * @brief The DomParser class  xml文件读写封装
*/

#ifdef DOMPARSER_LIBRARY
#include "domparser_global.h"
class  DOMPARSERSHARED_EXPORT  DomParser
#else
/**
 * @brief The DomParser class xml读写类
 */
class  DomParser
#endif
{
public:
      DomParser();
      ~DomParser();
 public:
//      int readVersion(std::vector <ComponentVersion> &componentVersionList);
      /**
       * @brief openXml 打开文件
       * @param FilePath 路径+文件名
       * @param mode 打开模式
       * @return ok= true
       */
      bool openXml(QString FilePath, QFile::OpenMode mode);
      void closeXml(bool save=false);

      QDomElement getRootDomElement();

      /**
       * @brief addNode 往某节点添加一个子元素
       * @param pnode   某节点
       * @param nodeName  子元素
       * @param text   子元素de值
       * @return   子元素
       */
      QDomElement addNode(QDomNode &pnode, QString nodeName, QString val="");
      QDomElement addNode(QDomNode &pnode, QString nodeName, int val);
      QDomElement addNode(QDomNode &pnode, QString nodeName, unsigned int val);
      QDomElement addNode(QDomNode &pnode, QString nodeName, long val);
      QDomElement addNode(QDomNode &pnode, QString nodeName, double val);

      /**
       * @brief readXml 获取节点数据
       * @param node
       * @param val
       * @return , true if ok
       */
      bool readXml( QDomNode node ,char &val );
      bool readXml( QDomNode node ,unsigned char &val );
      bool readXml( QDomNode node, int &val );
      bool readXml( QDomNode node ,unsigned int &val );
      bool readXml( QDomNode node, float &val );
      bool readXml( QDomNode node, double &val );
      bool readXml( QDomNode node, long &val );
      bool readXml( QDomNode node, long long &val );
      bool readXml( QDomNode node, QString &val );
      bool readXml( QDomNode node, std::string &val );
      bool readXml( QDomNode node, bool &val );

      /**
       * @brief writeXml 写入节点数据
       * @param node
       * @param val
       */
      void writeXml( QDomNode node, unsigned char &val );
      void writeXml( QDomNode node, char &val );
      void writeXml( QDomNode node, bool &val );
      void writeXml( QDomNode node, unsigned int &val );
      void writeXml( QDomNode node, int &val );
      void writeXml( QDomNode node, double &val );
      void writeXml( QDomNode node, long long  &val );
      void writeXml( QDomNode node, QString val );
      /**********************************
       * 日期：2017-3-7
       *  添加人：ｓｔｅｖｅｎ
       * 添加内容：写入ｘｍｌ文件相关的节点属性和值
       * ********************************/
      /**
       * @brief writeXml
       * @param rootNode
       * @param nodeName
       * @param nodeValue
       * @param nodeAttr1
       * @param nodeValue1
       * @param nodeAttr2
       * @param nodeValue2
       * @param nodeAttr3
       * @param nodeValue3
       */
      void writeXml(QString rootNode,QString nodeName,QString nodeValue,QString nodeAttr1 = "",QString nodeValue1 = "",
                    QString nodeAttr2="",QString nodeValue2 = "",QString nodeAttr3 = "",QString nodeValue3 = "");

      /**
       * @brief findSubNode 查找节点的子节点
       * @param node
       * @param name
       * @return
       */
      QDomNode findSubNode(const QDomNode &node, QString name, bool &ok );

      /**
       * @brief findSibNode,  //在当前给的list中查找节点
       * @param node
       * @param name
       * @param ok
       * @return
       */
      QDomNode findSibNode(const QDomNodeList &nodelist, QString name , bool&ok);

      /**
       * @brief findNode, 在树中查找节点
       * @param nodeTree ,nodeTree ={ 二级节点名,  三级节点名, 四级节点名 ... ... }
       * @param ok, true if ok
       * @return, 节点
       */
      QDomNode findNode( const QStringList &nodeTree, bool &ok );


protected:
      /**
       * @brief m_file 当前打开文件指针
       */
      QFile *m_file;
      /**
       * @brief m_filePath  记录当前打开文件
 ‘*/
      QString m_filePath;

      /**
       * @brief m_doc //主节点
       */
      QDomDocument m_doc; //主节点
      QDomElement m_root; //主节点
//      ComponentVersion versionInfo;



};

#endif // DOMPARSER_H
